package _case

import (
	"fmt"
	"strconv"
	"time"
	"unsafe"
)

func ConvertCase() {
	//同一类数据转换：数字转数字，字符串和字符和字节
	//不同类型的数据转换 数字和字符串
	//接口类型转其他类型

	//数字类型的转换
	var n1 int = 100
	fmt.Println(int64(n1))
	var int16s int16 = 10000
	var int32s int32 = 1000000000
	fmt.Println(int32(int16s))
	fmt.Println(int16(int32s)) //-13824：高精度转换低精度，会丢失精度

	//字符串和数字类型转换
	var num = 100
	fmt.Println(strconv.Itoa(num) + "abc") //数字转字符串
	var str = "100"
	n, _ := strconv.Atoi(str)
	fmt.Println(n + 100) //字符串转数字

	//数字和字符串，进制转换
	var num1 int64 = 1010
	fmt.Println(strconv.FormatInt(num1, 10) + "abc")

	var str1 = "100"
	fmt.Println(strconv.ParseInt(str1, 10, 64))

	//字符串和[]byte转换
	var str2 = "今天天气很好"
	b1 := []byte(str2)
	fmt.Println(b1)
	fmt.Println(string(b1))

	//字符串和rune转换
	//rune为int32类型
	rune1 := []rune(str2)
	fmt.Println(rune1) //实际存储Unicode码点
	fmt.Println(string(rune1[1]))
	fmt.Println(len(str2))  //字符数18
	fmt.Println(len(rune1)) //字节数6

	//接口类型转具体类型
	var inter interface{} = 100
	num2, ok := inter.(int)
	fmt.Println(num2, ok)

	inter = User{}
	u, ok := inter.(User)
	fmt.Println(u, ok)

	//时间类型转字符串
	var t time.Time
	t = time.Now()
	timeStr := t.Format("2006-01-02 15:04:05Z07:00")
	fmt.Println(timeStr)

	//字符串转时间类型
	time, err := time.Parse("2006-01-02 15:04:05Z07:00", timeStr)
	fmt.Println(time, err)

	//uintptr
	//通用指针类型，不能用于计算
	u1 := User{}
	//获取结构体指针地址
	uPtr := unsafe.Pointer(&u1)
	fmt.Println(uPtr)          //0xc00010e4e0
	fmt.Println(uintptr(uPtr)) //824634828000
	//属性指针 = 对象指针 + 属性偏移值
	namePtr := unsafe.Pointer(uintptr(uPtr) + unsafe.Offsetof(u1.Name))
	agePtr := unsafe.Pointer(uintptr(uPtr) + unsafe.Offsetof(u1.Age))
	//转换为string的指针类型，再赋值
	*(*string)(namePtr) = "nick"
	*(*uint8)(agePtr) = 10
	fmt.Println(u1)
}
